awk memo
Last update 2018.7.6
基本(?)
ファイル(仮に abe.dat とする)の2列目を表示させたいとき
awk '{print $2}' abe.dat
3行目を表示させたいとき
awk 'NR==3{print}' abe.dat
3列目が 正 の場合のみ表示させる
awk '$3>0 {print}' file.dat
3列目が 0 かつ 5列目が 0.5 以上の場合のみ表示させる
awk '$3 == 0 && $5 > 0.5 {print}' file.dat
フォーマットを変えたいとき。
oldval=1234
# 1234.000000
newval=`echo $oldval | awk '{ OFMT = "%.6f"} {print $1*1.00000000001 }'`
# 1.23400e+03
newval=`echo $oldval | awk '{ OFMT = "%.6e"} {print $1*1.00000000001 }'`
もっと精度が欲しい場合は、1.000....01 の0を増やす。
もしくは、oldval が整数でなければ、$1+0. でも良い。
+0. や *1.00000000001 が無いと、数値として認識してくれないので、こうする。
script 内で使うとき
Script内の変数をawkの引数などで使いたいときは、awkの変数に変更する必要があるようだ。
hoge = 3;
awk -v hoge=$hoge 'NR==hoge{print}' abe.dat
# 次のは動かない
awk 'NR==$hoge{print}' abe.dat
gnuplot で使うとき
plot "< awk '$7<0{print}' file.dat" u 1:7
行と列を入れ替えたい
paste -s をつかうが、awkも使うので、ここに書く。次のデータがあったとして、
a 10
b 20
c 30
次のように行と列を入れ替えたいとする。
a b c
10 20 30
これは、例えばcalchepでpar_scan_sum したいときにしたくなる場合がある。
このデータが書かれたファイルを"data.dat"として、次のようにする。
awk '{print $1}' data.dat > dam1.dat
awk '{print $2}' data.dat > dam2.dat
paste -s dam1.dat dam2.dat > newdata.dat
paste の -s が重要。-sが無いと、data.dat と同じになってしまう。